package generator;

import java.util.*;

import uslugi.EkstensjaLokata;
import uslugi.Lokata;
import uslugi.LokataKlienta;
import util.KapitalizacjaEnum;
import util.MathUtil;
import util.TypLokatyEnum;

import klient.Klient;

/*
 * Klasa przypisujaca klientom historie lokat wczesniej zdefiniowanych
 * 
 */

public class GeneratorLokatKlientow {

	private List<Klient> klienci;

	private EkstensjaLokata lokaty;

	public GeneratorLokatKlientow(List<Klient> klienci, EkstensjaLokata lokaty) {
		this.klienci = klienci;
		this.lokaty = lokaty;
	}

	public List<LokataKlienta> przypiszLokaty() {

		long id = 1;

		List<LokataKlienta> lokatyKlientow = new LinkedList<LokataKlienta>();

		// co 10 klient ma u nasz konto
		for (int i = 0; i < klienci.size(); i += 10) {

			Klient k = klienci.get(i);

			// Kapitalizacja - nasz wyznacznik wysokosci lokaty
			KapitalizacjaEnum kapit = przypiszKapitalizacje(k
					.getOszczednosciMsc());

			Lokata wylosowanaLokata = losujLokate(kapit);

			int kwotaLokaty = losujKwoteLokaty(wylosowanaLokata
					.getMinimalnaKwota(), k.getOszczednosciMsc());

			Date dataZawarcia = MathUtil.losujDate(k.getDataUrodzenia());

			LokataKlienta lk = new LokataKlienta(id + (i/10), k,
					wylosowanaLokata, kwotaLokaty, TypLokatyEnum.Z,
					dataZawarcia);

			lokatyKlientow.add(lk);
			
		}

		return lokatyKlientow;

	}

	private KapitalizacjaEnum przypiszKapitalizacje(int oszcz) {
		// BTW: Lokaty rozrozniamy poprzez kapitalizacje
		// kapitalizacja roczna = lokata niska
		// kapitalizacja msc = lokata srednia
		// kapitalizacja dzienna = lokata wysoka

		// Jezeli klient oszcz < 1k to biedny wezmie lokate niska
		// Jezeli klient oszcz < 4k to sredni wezmie lokate srednia
		// jezeli klient oszcz > 4k to bogaty wezmie lokate wysoka
		if (oszcz < 1000)
			return KapitalizacjaEnum.R;
		else if (oszcz < 4000)
			return KapitalizacjaEnum.M;
		else
			return KapitalizacjaEnum.D;
	}

	private Lokata losujLokate(KapitalizacjaEnum kapit) {
		switch (kapit) {
		case R:
			return lokaty.getLosowaLokateNiska();
		case M:
			return lokaty.getLosowaLokateSrednia();
		case D:
			return lokaty.getLosowaLokateWysokie();
		default:
			return null;
		}
	}

	private int losujKwoteLokaty(int kwotaMin, int oszcz) {
		// kwota lokaty to kwotaMin + oszcz pomnozone od 2 do 5 razy
		return kwotaMin + (oszcz * MathUtil.losujInta(2, 5));

	}

	public static void main(String[] args) {

		List<Klient> klienci = new ArrayList<Klient>();
		for (int i = 0; i < 100000; i++) {
			klienci.add(GeneratorKlientow.generujKlienta());

		}

		GeneratorLokatKlientow g = new GeneratorLokatKlientow(klienci,
				new EkstensjaLokata(new GeneratorLokat().generujLokaty()));

		List<LokataKlienta> test =	g.przypiszLokaty();

		for(LokataKlienta lk: test) lk.dajInfo();
		
	}

}
